﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorStep.h
 * @brief  Abaqus Step 适配器 用于读取INP过程中的Step解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-03-26
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTORSTEP__H__
#define __FITKABAQUSADAPTORSTEP__H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaStepManager)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaStepInit)
ForwardDeclarNS(Interface, FITKAbaStepFrequency)
ForwardDeclarNS(Interface, FITKAbaStepGeneralStatic)
ForwardDeclarNS(Interface, FITKAbaStepDynamicExplicit)
ForwardDeclarNS(Interface, FITKAbaAbstractLoad)
ForwardDeclarNS(Interface, FITKAbaAbstractBoundaryCondition)
ForwardDeclarNS(Interface, FITKAbaAbstractOutput)
ForwardDeclarNS(Interface, FITKAbaFieldOutputManager)
ForwardDeclarNS(Interface, FITKAbaHistoryOutputManager)
ForwardDeclarNS(Interface, FITKAbaAbstractPredefinedField)

namespace IO
{
    /**
     * @brief Abaqus Step 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-26
     */
    class FITKAbaqusAdaptorStep : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorStep() = default;
        ~FITKAbaqusAdaptorStep() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData 算例数据对象
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptW() override;


    private:


        /**
         * @brief 读取初始分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool readInit();

        /**
         * @brief 读取静态分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool readStatic();

        /**
         * @brief 读取动态分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool readDynamic();

        /**
         * @brief 读取频率分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool readFrequency();

        /**
         * @brief 读取重开始结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool readRestart();

        /**
         * @brief 读取输出结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool readOutput();

        /**
         * @brief 读取分析步中的边界(Boundary)条件
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-10
         */
        bool readBoundary();

        /**
         * @brief 读取分析步中的相互作用(Interaction)条件
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-10
         */
        bool readInteraction();

        /**
         * @brief 读取载荷
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-01
         */
        bool readLoad();

        /**
         * @brief 读取预定义场
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-04
         */
        bool readPredefinedField();

        /**
         * @brief 写出静态分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool writeStatic();

        /**
         * @brief 写出动态分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool writeDynamic();

        /**
         * @brief 写出频率分析类型
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-27
         */
        bool writeFrequency();

        /**
         * @brief 写出输出结构
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-17
         */
        bool writeOutput();

        /**
         * @brief 写出分析步中的边界(Boundary)条件
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-10
         */
        bool writeBoundary();

        /**
         * @brief 写出分析步中的相互作用(Interaction)条件
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-10
         */
        bool writeInteraction();

        /**
         * @brief 写出载荷
         * @return 状态 true 正确 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-02
         */
        bool writeLoad();

        /**
         * @brief 写出预定义场
         * @return 状态 true 正确 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-05
         */
        bool writePredefinedField();

        /**
         * @brief
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-05-09
         */
        bool writeRestart();

        /**
         * @brief 设置boundary取消激活分析步
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-15
         */
        void setBoundaryDeactiveStepR();

        /**
         * @brief 设置Interaction取消激活分析步
         * @param type 类型 
         * @param stepID 分析步ID
         * @param name 名字 作为唯一标识 通用接触没有固定name
         * @return 状态 true 正确 false 失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-02
         */
        void setInteractionDeactiveStepR(int type, int stepID, QString name);

        /**
         * @brief 更新Output取消激活分析步
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-02
         */
        void updateOutputDeactiveStepR();

        /**
         * @brief 写出Boundary的类型
         * @param boundary 数据存储器
         * @param op op数据
         * @return stepId 0不可写出
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-15
         */
        int writeBoundaryDataType(Interface::FITKAbaAbstractBoundaryCondition* boundary, QString &op);

        /**
         * @brief 写出load的类型
         * @param load 数据存储器
         * @param op op数据
         * @return stepId 0不可写出
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-15
         */
        int writeLoadDataType(Interface::FITKAbaAbstractLoad* load, QString &op);

        /**
         * @brief 写出预定义场数据判断
         * @param load 数据存储器
         * @param op op数据
         * @return stepId 0不可写出
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-07-05
         */
        int writePredefinedFieldDataType(Interface::FITKAbaAbstractPredefinedField* fieldData, QString &op);

    private:

        /**
         * @brief 分析步（Step）数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        Interface::FITKAbaAbstractStep* _stepData{};

        /**
         * @brief 分析步（Step）管理器
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        Interface::FITKAbaStepManager* _stepDataManager{};

        /**
         * @brief 记录上一个output的数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-15
         */
        Interface::FITKAbaAbstractOutput* _previousData{};

        /**
         * @brief 场输出管理器
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-16
         */
        Interface::FITKAbaFieldOutputManager* _fieldOutputManager{};

        /**
         * @brief 历程输出管理器
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-16
         */
        Interface::FITKAbaHistoryOutputManager* _historyOutputManager{};

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        AbaqusData::FITKDataCase* _caseData{};
    };

    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaAbstractStep, FITKAbaqusAdaptorStep)
}

#endif